package com.promise.jokerdream.work

import com.promise.jokerdream.config.game.BaseGameConfig
import com.promise.jokerdream.config.user.UserConfig
import com.promise.jokerdream.work.penguin.*
import com.promise.jokerdream.work.mercenary.MercenaryDispatchWork
import com.promise.jokerdream.work.faction.FactionCommerceWork
import com.promise.jokerdream.work.signin.WorldTreeWork
import com.promise.jokerdream.work.knight.Arena.KnightArenaWork
import com.promise.jokerdream.work.signin.PenguinTravelogueWork
import com.promise.jokerdream.work.signin.TenlotteryWork
import com.promise.jokerdream.work.signin.newact.ClawMachineWork
import com.promise.jokerdream.work.signin.midautumn.MidAutumnGiftWork
import com.promise.jokerdream.work.signin.lucky.LuckyExchangeWork
import com.promise.jokerdream.work.signin.dream.DreamTripWork
import com.promise.jokerdream.work.signin.PenguinComebackWork
import com.promise.jokerdream.work.signin.before.ApprenticeWork
import com.promise.jokerdream.work.signin.before.DailyGiftWork
import com.promise.jokerdream.work.signin.before.PrivilegeCardWork
import com.promise.jokerdream.work.signin.after.CalendarWork
import com.promise.jokerdream.work.team.sect.SectWork
import com.promise.jokerdream.work.team.sect.SectTournamentWork
import com.promise.jokerdream.work.knight.lnn.KnightLnnWork
import com.promise.jokerdream.work.signin.newact.SaviorsTurntableWork
import com.promise.jokerdream.work.faction.FactionChallengeWork
import com.promise.jokerdream.work.faction.FactionTaskWork
import com.promise.jokerdream.work.faction.FactionFeedDemoWork
import com.promise.jokerdream.work.faction.FactionMineWork
import com.promise.jokerdream.work.faction.FactionAltarWork
import com.promise.jokerdream.work.faction.FactionArmyWork
import com.promise.jokerdream.work.faction.FactionForageWork
import com.promise.jokerdream.work.faction.FactionLeagueWork
import com.promise.jokerdream.work.faction.FactionTerritoryWork
import com.promise.jokerdream.work.signup.AscendHeavenWork
import com.promise.jokerdream.work.signup.ThronesBattleWork
import com.promise.jokerdream.work.knight.island.KnightIslandWork
import com.promise.jokerdream.work.mercenary.MercenaryFormationWork
import com.promise.jokerdream.work.signin.PenguinStationWork
import com.promise.jokerdream.work.signin.after.DailyChestWork
import com.promise.jokerdream.work.signin.after.KitchenWork
import com.promise.jokerdream.work.signin.after.LivenessWork
import com.promise.jokerdream.work.signin.after.PenguinShareWork
import com.promise.jokerdream.work.signin.after.PenguinTaskWork
import com.promise.jokerdream.work.signin.lucky.LuckyGoldenEggWork
import com.promise.jokerdream.work.signin.newact.AbyssDrawWork
import com.promise.jokerdream.work.signin.newact.ScratchCardWork
import com.promise.jokerdream.work.signin.newact.GiftRisingWork
import com.promise.jokerdream.work.signin.newact.DailyGiftExchangeWork
import com.promise.jokerdream.work.signin.WeeklyGiftWork
import com.promise.jokerdream.work.signin.after.ChaosWarWork
import com.promise.jokerdream.work.signin.after.EnchantWork
import com.promise.jokerdream.work.penguin.ChaosWarRefreshWork
import com.promise.jokerdream.work.signin.ActMenuWork
import com.promise.jokerdream.work.signin.BirthdayWork
import com.promise.jokerdream.work.signin.OddEvenWork
import com.promise.jokerdream.work.signin.after.WishWork
import com.promise.jokerdream.work.signin.before.LoginGiftWork
import com.promise.jokerdream.work.signin.newact.LuckyWheelWork
import com.promise.jokerdream.work.signup.WulinWork
import com.promise.jokerdream.utils.TimeUtils
import com.promise.jokerdream.work.signin.BadgeWork
import com.promise.jokerdream.work.signin.after.ActiveGiftWork

/**
 * 工作工厂类
 * 负责根据用户配置创建相应的工作列表
 */
object WorkFactory {
    
    /**
     * 根据用户配置创建工作列表
     * @param userId 用户ID
     * @param userConfig 用户配置
     * @return 工作列表
     */
    fun createWorks(userId: String, userConfig: UserConfig): List<IWork> {
        val works = mutableListOf<IWork>()
        val gameConfig = userConfig.gameConfig
        
        // 无需判断直接添加的工作
        // 每日奖励工作
        works.add(DailyGiftWork(userId))
        // 特权卡工作
        works.add(PrivilegeCardWork(userId))
        // 乐斗黄历工作
        works.add(CalendarWork(userId))
        // 每日宝箱工作
        works.add(DailyChestWork(userId))
        // 活跃度工作
        works.add(LivenessWork(userId))
        // 帮派任务工作
        works.add(FactionTaskWork(userId))
        // 乐斗分享工作
        works.add(PenguinShareWork(userId))
        // 日常任务工作
        works.add(PenguinTaskWork(userId))
        // 好礼步步升工作
        works.add(GiftRisingWork(userId))
        // 抓娃娃机工作
        works.add(ClawMachineWork(userId))
        // 神魔转盘工作
        works.add(SaviorsTurntableWork(userId))
        // 邪神秘宝工作
        works.add(TenlotteryWork(userId))
        // 中秋礼盒工作
        works.add(MidAutumnGiftWork(userId))
        // 每日兑换礼包工作
        works.add(DailyGiftExchangeWork(userId))
        // 深渊秘宝工作
        works.add(AbyssDrawWork(userId))
        // 幸运金蛋工作
        works.add(LuckyGoldenEggWork(userId))
        // 菜菜厨房
        works.add(KitchenWork(userId))
        // 吉利兑工作
        works.add(LuckyExchangeWork(userId))
        // 周周礼包工作
        works.add(WeeklyGiftWork(userId))
        // 大侠回归工作
        works.add(PenguinComebackWork(userId))
        // 黄金联赛工作
        works.add(FactionLeagueWork(userId))
        // 乐斗驿站
        works.add(PenguinStationWork(userId))
        // 附魔工作
        works.add(EnchantWork(userId))
        // 六门会武
        works.add(SectMeleeWork(userId))
        // 生日工作
        works.add(BirthdayWork(userId))
        // 许愿工作
        works.add(WishWork(userId))
        // 帮派远征工作
        works.add(FactionArmyWork(userId))
        // 巅峰之战工作
        works.add(PeakBattleWork(userId))
        // 群雄逐鹿工作
        works.add(ThronesBattleWork(userId))
        // 粮草领奖
        works.add(FactionForageWork(userId))
        // 乐斗菜单
        works.add(ActMenuWork(userId))
        // 问鼎天下
        works.add(FactionTerritoryWork(userId))
        // 幸运转盘工作
        works.add(LuckyWheelWork(userId))
        // 猜单双工作
        works.add(OddEvenWork(userId))
        // 登录有礼工作
        works.add(LoginGiftWork(userId))
        // 徽章战令工作
        works.add(BadgeWork(userId))
        // 活跃礼包工作
        works.add(ActiveGiftWork(userId))

        // 乱斗工作
        if (gameConfig.chaosWarConfig.enabledSetting) {
            works.add(ChaosWarRefreshWork(userId, gameConfig.chaosWarConfig))
            works.add(ChaosWarWork(userId))
        }

        // 十二宫工作
        if (gameConfig.constellationConfig.enabledSetting) {
            works.add(ConstellationWork(gameConfig.constellationConfig, userId))
        }

        // 幻境工作
        if (gameConfig.mistyConfig.enabledSetting) {
            works.add(MistyWork(gameConfig.mistyConfig, userId))
        }

        // 深渊工作
        if (gameConfig.abyssConfig.enabledSetting) {
            works.add(AbyssWork(gameConfig.abyssConfig, userId))
        }

        // 刮刮卡工作
        if (gameConfig.scratchConfig.enabledSetting) {
            works.add(ScratchCardWork(userId))
        }

        // 乐斗工作
        if (gameConfig.penguinFightConfig.enabledSetting) {
            works.add(PenguinFightAutoWork(gameConfig.penguinFightConfig, userId))
        }

        // 押镖工作
        if (gameConfig.escortConfig.enabledSetting) {
            works.add(PenguinEscortWork(gameConfig.escortConfig, userId))
        }

        // 历练工作
        if (gameConfig.experienceConfig.enabledSetting) {
            works.add(PenguinExperienceWork(gameConfig.experienceConfig, userId))
        }

        // 飞升工作
        if (gameConfig.ascendHeavenConfig.enabledSetting) {
            val config = gameConfig.ascendHeavenConfig
            if (!config.scheduledChallengeEnabled || TimeUtils.isTimePassed(config.registrationTime)) {
                works.add(AscendHeavenWork(config, userId))
            }
        }

        // 竞技场工作
        if (gameConfig.arenaConfig.enabledSetting) {
            val config = gameConfig.arenaConfig
            if (!config.scheduledChallengeEnabled || TimeUtils.isTimeToChallenge(config.registrationTime)) {
                works.add(PenguinArenaWork(config, userId))
            }
        }

        // 武林工作
        if (gameConfig.wulinConfig.enabledSetting) {
            val config = gameConfig.wulinConfig
            if (!config.scheduledChallengeEnabled || TimeUtils.isTimePassed(config.registrationTime)) {
                works.add(WulinWork(config, userId))
            }
        }

        // 侠士论剑工作
        if (gameConfig.knightArenaConfig.enabledSetting) {
            val config = gameConfig.knightArenaConfig
            if (!config.scheduledChallengeEnabled || TimeUtils.isTimeToChallenge(config.registrationTime)) {
                works.add(KnightArenaWork(config, userId))
            }
        }

        // 佣兵派遣工作
        if (gameConfig.mercenaryDispatchConfig.enabledSetting) {
            works.add(MercenaryDispatchWork(gameConfig.mercenaryDispatchConfig, userId))
        }

        // 仙武工作
        if (gameConfig.immortalsConfig.enabledSetting) {
            works.add(ImmortalsWork(gameConfig.immortalsConfig, userId))
        }

        // 侠士客栈工作
        if (gameConfig.knightConfig.enabledSetting) {
            works.add(KnightLnnWork(gameConfig.knightConfig, userId))
        }

        // 世界树工作
        if (gameConfig.worldTreeConfig.enabledSetting) {
            works.add(WorldTreeWork(userId))
        }

        // 帮派商会工作
        if (gameConfig.factionCommerceConfig.enabledSetting) {
            works.add(FactionCommerceWork(gameConfig.factionCommerceConfig, userId))
        }

        // 武林盟主工作
        if (gameConfig.wlmzConfig.enabledSetting) {
            works.add(PenguinWlmzWork(gameConfig.wlmzConfig, userId))
        }

        // 帮派供奉工作
        if (gameConfig.factionFeedDemoConfig.enabledSetting) {
            works.add(FactionFeedDemoWork(gameConfig.factionFeedDemoConfig, userId))
        }

        // 侠客岛工作
        if (gameConfig.knightMissionConfig.enabledSetting) {
            works.add(KnightIslandWork(gameConfig.knightMissionConfig, userId))
        }

        // 门派工作
        if (gameConfig.sectConfig.enabledSetting) {
            works.add(SectWork(gameConfig.sectConfig, userId))
        }

        // 门派邀请赛工作
        if (gameConfig.sectTournamentConfig.enabledSetting) {
            works.add(SectTournamentWork(gameConfig.sectTournamentConfig, userId))
        }

        // 佣兵助阵工作
        if (gameConfig.formationConfig.enabledSetting) {
            works.add(MercenaryFormationWork(gameConfig.formationConfig, userId))
        }

        // 斗豆兑换工作
        if (gameConfig.currencyExchangeConfig.enabledSetting) {
            works.add(CurrencyExchangeWork(gameConfig.currencyExchangeConfig, userId))
        }

        // 其他工作
        if (gameConfig.otherConfig.enabledSetting) {
            // 梦幻之旅工作
            if (gameConfig.otherConfig.dreamTripEnabled) {
                works.add(DreamTripWork(false, userId))
            }

            // 乐斗游记工作
            if (gameConfig.otherConfig.penguinTravelogueEnabled) {
                works.add(PenguinTravelogueWork(userId))
            }

            // 帮派踢馆工作
            if (gameConfig.otherConfig.factionChallengeEnabled) {
                works.add(FactionChallengeWork(userId))
            }

            // 画卷迷踪工作
            if (gameConfig.otherConfig.scrollDungeonEnabled) {
                works.add(ScrollDungeonWork(gameConfig.otherConfig, userId))
            }

            // 帮派祭坛工作
            if (gameConfig.otherConfig.factionAltarEnabled) {
                works.add(FactionAltarWork(userId))
            }

            // 矿洞工作
            if (gameConfig.otherConfig.factionMineEnabled) {
                works.add(FactionMineWork(userId))
            }

            // 重出江湖
            if (gameConfig.otherConfig.penguinRecallEnabled) {
                works.add(PenguinRecallWork(userId))
            }

            // 徒弟经验工作
            if (gameConfig.otherConfig.apprenticeExperienceEnabled) {
                works.add(ApprenticeWork(userId))
            }
        }
        
        return works
    }
    
    /**
     * 检查是否到了定时任务的时间
     * @param config 游戏配置
     * @return 是否到了执行时间
     */
    private fun isTimeToExecute(config: BaseGameConfig): Boolean {
        if (!config.scheduledChallengeEnabled) {
            return false // 如果没有启用定时挑战，直接执行
        }
        
        return TimeUtils.isTimePassed(config.registrationTime)
    }

    /**
     * 获取定时任务列表
     * @param userId 用户ID
     * @param userConfig 用户配置
     * @return 每分钟任务列表
     */
    fun createScheduledWorks(userId: String, userConfig: UserConfig): List<IWork> {
        // 定时执行的任务列表
        val works = mutableListOf<IWork>()
        val gameConfig = userConfig.gameConfig

        // 飞升工作 - 检查定时逻辑
        if (gameConfig.ascendHeavenConfig.enabledSetting && isTimeToExecute(gameConfig.ascendHeavenConfig)) {
            works.add(AscendHeavenWork(gameConfig.ascendHeavenConfig, userId))
        }

        // 竞技场工作 - 检查定时逻辑
        if (gameConfig.arenaConfig.enabledSetting && isTimeToExecute(gameConfig.arenaConfig)) {
            works.add(PenguinArenaWork(gameConfig.arenaConfig, userId))
        }

        // 武林工作 - 检查定时逻辑
        if (gameConfig.wulinConfig.enabledSetting && isTimeToExecute(gameConfig.wulinConfig)) {
            works.add(WulinWork(gameConfig.wulinConfig, userId))
        }

        // 侠士论剑工作 - 检查定时逻辑
        if (gameConfig.knightArenaConfig.enabledSetting && isTimeToExecute(gameConfig.knightArenaConfig)) {
            works.add(KnightArenaWork(gameConfig.knightArenaConfig, userId))
        }

        return works
    }
    
    /**
     * 获取领奖任务列表
     * @param userId 用户ID
     * @param userConfig 用户配置
     * @return 整点任务列表
     */
    fun createRewardWorks(userId: String, userConfig: UserConfig): List<IWork> {
        // 领奖的任务列表（通常是更重要的任务）
        val works = mutableListOf<IWork>()
        val gameConfig = userConfig.gameConfig

        // 活跃度工作
        works.add(LivenessWork(userId))
        // 帮派任务工作
        works.add(FactionTaskWork(userId))
        // 日常任务工作
        works.add(PenguinTaskWork(userId))
        // 邪神秘宝工作
        works.add(TenlotteryWork(userId))
        // 中秋礼盒工作
        works.add(MidAutumnGiftWork(userId))
        // 幸运金蛋工作
        works.add(LuckyGoldenEggWork(userId))
        // 菜菜厨房
        works.add(KitchenWork(userId))
        // 吉利兑工作
        works.add(LuckyExchangeWork(userId))
        // 大侠回归工作
        works.add(PenguinComebackWork(userId))
        // 附魔工作
        works.add(EnchantWork(userId))
        // 帮派远征工作
        works.add(FactionArmyWork(userId))
        // 群雄逐鹿工作
        works.add(ThronesBattleWork(userId))
        // 幸运转盘工作
        works.add(LuckyWheelWork(userId))

        // 乱斗工作
        if (gameConfig.chaosWarConfig.enabledSetting) {
            works.add(ChaosWarRefreshWork(userId, gameConfig.chaosWarConfig))
            works.add(ChaosWarWork(userId))
        }

        // 深渊工作
        if (gameConfig.abyssConfig.enabledSetting) {
            works.add(AbyssWork(gameConfig.abyssConfig, userId))
        }

        // 押镖工作
        if (gameConfig.escortConfig.enabledSetting) {
            works.add(PenguinEscortWork(gameConfig.escortConfig, userId))
        }

        // 帮派商会工作
        if (gameConfig.factionCommerceConfig.enabledSetting) {
            works.add(FactionCommerceWork(gameConfig.factionCommerceConfig, userId))
        }

        // 武林盟主工作
        if (gameConfig.wlmzConfig.enabledSetting) {
            works.add(PenguinWlmzWork(gameConfig.wlmzConfig, userId))
        }

        // 侠客岛工作
        if (gameConfig.knightMissionConfig.enabledSetting) {
            works.add(KnightIslandWork(gameConfig.knightMissionConfig, userId))
        }

        // 其他工作
        if (gameConfig.otherConfig.enabledSetting) {

            // 乐斗游记工作
            if (gameConfig.otherConfig.penguinTravelogueEnabled) {
                works.add(PenguinTravelogueWork(userId))
            }

            // 帮派祭坛工作
            if (gameConfig.otherConfig.factionAltarEnabled) {
                works.add(FactionAltarWork(userId))
            }
        }

        return works
    }
}
